home *** CD-ROM | disk | FTP | other *** search
/ Aminet 41 / Aminet 41 (2001)(Schatztruhe)[!][Feb 2001].iso / Aminet / comm / misc / ClipWatch.lha / ClipWatch / Sources / trsii.c < prev    next >
C/C++ Source or Header  |  2000-12-29  |  23KB  |  867 lines

  1. /*
  2.  
  3.      PROTOCOLE TRSII
  4.        Pour dialoguer avec les télétransmissions CLIP / FORCE (Constructeur WIT)
  5.        http://www.wit.fr
  6.  
  7.      Marc Le Douarain , Décembre 1998
  8.      mavati@club-internet.fr
  9.      http://perso.club-internet.fr/mavati
  10.      http://www.multimania.com/mavati
  11.  
  12.      Dernière mise à jour : 29 décembre 2000
  13.  
  14. */
  15.  
  16.  
  17.  
  18. void Mem_FreeAll(void)
  19. {
  20.  if (Ress!=NULL)
  21.  {
  22.   free(Ress);
  23.   Ress=NULL;
  24.  }
  25.  if (Jrnl!=NULL)
  26.  {
  27.   free(Jrnl);
  28.   Jrnl=NULL;
  29.  }
  30.  if (MessagesBoxMemZone!=NULL)
  31.  {
  32.   free(MessagesBoxMemZone);
  33.   MessagesBoxMemZone=NULL;
  34.  }
  35.  if(TrameRecue!=NULL)
  36.  {
  37.   free(TrameRecue);
  38.   TrameRecue=NULL;
  39.  }
  40. }
  41.  
  42. void Mem_AllocAll(void)
  43. {
  44.  int i;
  45.  Ress=(struct Ressources *)malloc(sizeof(struct Ressources)*NBR_RESSOURCES);
  46.  if (Ress==NULL)
  47.  {
  48.   ErrorMessageRequest("Could not alloc enough memory (for ressources)");
  49.   exit(0);
  50.  }
  51.  Jrnl=NULL;
  52.  MessagesBoxMemZone=(char *)malloc(sizeof(char)*256*NBR_MESSAGESBOX);
  53.  if (MessagesBoxMemZone==NULL)
  54.  {
  55.   ErrorMessageRequest("Could not alloc enough memory (for MessagesBox)");
  56.   Mem_FreeAll();
  57.   exit(0);
  58.  }
  59.  for (i=0;i<NBR_MESSAGESBOX;i++)
  60.  {
  61.   MessagesBox[i]=&MessagesBoxMemZone[i*255];
  62.  }
  63.  TrameRecue=(char *)malloc(10000);
  64.  if (TrameRecue==NULL)
  65.  {
  66.   ErrorMessageRequest("Could not alloc enough memory (for ReceptFrame)");
  67.   Mem_FreeAll();
  68.   exit(0);
  69.  }
  70. }
  71.  
  72.  
  73.  
  74. /* ########################################## */
  75. /* # Sauvegarde/Lecture des fichiers traces # */
  76. /* ########################################## */
  77.  
  78. /* Sauvegarde sur disque de la trace */
  79. /* --------------------------------- */
  80. void save_trace_to_disk(char * Fichier,char * TrameTrace,int LgtTrameTrace)
  81. {
  82.  FILE * FTrace;
  83.  time_t TimeLastSampleSaved;
  84.  int PeriodSample;
  85.  time_t TimeLastSampleRecup;
  86.  time_t TimeSampleRecupBalayage;
  87.  int NbrSamplesBalayage;
  88.  int i;
  89.  char * PtrTrame;
  90.  char * CharTmp;
  91.  struct tm DateEnClair;
  92.  int AnneesDepuis1900;
  93. // char DateEnClairSAS[6];
  94. // int AnneePourSAS;
  95.  DateEnClair.tm_sec  = 00;     /* seconds after the minute   */
  96.  DateEnClair.tm_min  = 00;     /* minutes after the hour     */
  97.  DateEnClair.tm_hour = 00;     /* hours since midnight       */
  98.  DateEnClair.tm_mday = 1;      /* day of the month           */
  99.  DateEnClair.tm_mon  = 1;      /* months since January       */
  100.  DateEnClair.tm_year = 78;     /* years since 1900           */
  101.  DateEnClair.tm_isdst = 0; /*1;*/    /* Daylight Savings Time flag */
  102.  TimeLastSampleSaved=mktime(&DateEnClair);
  103.  /* Trace en fonctionnement ? */
  104.  CharTmp=(str_field(TrameTrace,LgtTrameTrace,4,'\t'));
  105.  if (CharTmp[0]='M')
  106.  {
  107.   /* On regarde si le fichier existe ... valeur de l'horodate du dernier échantillon sauvé */
  108.   FTrace=fopen(Fichier,"rb");
  109.   if (FTrace)
  110.   {
  111.    fseek(FTrace,-(sizeof(int)+sizeof(double)),SEEK_END);
  112.    fread(&TimeLastSampleSaved,sizeof(time_t),1,FTrace);
  113.    fclose(FTrace);
  114.   }
  115.   /* Valeur de l'horodate du dernier échantillon récupéré */
  116.   /* Dernières versions de Clip (>v45?) renvoie l'année sur 4 chiffres directement !!!*/
  117.   AnneesDepuis1900 = atoi(str_field(TrameTrace,LgtTrameTrace,8,'\t'));
  118.   if (AnneesDepuis1900>1900)
  119.    AnneesDepuis1900 = AnneesDepuis1900 - 1900;
  120.   DateEnClair.tm_hour = atoi(str_field(TrameTrace,LgtTrameTrace,9,'\t'));
  121.   DateEnClair.tm_min  = atoi(str_field(TrameTrace,LgtTrameTrace,10,'\t'));
  122.   DateEnClair.tm_sec  = atoi(str_field(TrameTrace,LgtTrameTrace,11,'\t'));
  123.   DateEnClair.tm_mday = atoi(str_field(TrameTrace,LgtTrameTrace,6,'\t'));
  124.   DateEnClair.tm_mon  = atoi(str_field(TrameTrace,LgtTrameTrace,7,'\t')) - 1;
  125.   DateEnClair.tm_year = (char)AnneesDepuis1900;
  126.   DateEnClair.tm_isdst = 0; /*1;*/
  127.   TimeLastSampleRecup=mktime(&DateEnClair);
  128.  
  129.   /* Nbr de secondes entre chaque échantillon */
  130.   {
  131.    char * Ptr = str_field(TrameTrace,LgtTrameTrace,5,'\t');
  132.    PeriodSample=atoi(Ptr+1);
  133.   }
  134.   /* Vérification échantillonnage plus récent */
  135.   if (TimeLastSampleRecup>TimeLastSampleSaved)
  136.   {
  137.    /* Balayage en arrière pour trouver l'échantillon à-partir d'où on effectuera le collage */
  138.    PtrTrame=str_field(TrameTrace,LgtTrameTrace,13,'\t');
  139.    TimeSampleRecupBalayage=TimeLastSampleRecup;
  140.    NbrSamplesBalayage=1;
  141.    do
  142.    {
  143.     TimeSampleRecupBalayage=TimeSampleRecupBalayage-PeriodSample;
  144.     /* Recherche du champ suivant contenant le nouvel échantillon */
  145.     do
  146.     {
  147.      PtrTrame++;
  148.     }while (*PtrTrame!='\t');
  149.     PtrTrame++;
  150.     NbrSamplesBalayage++;
  151.    }
  152.    while( (*PtrTrame!='\0') && (*(PtrTrame+1)!=13) && (PtrTrame<(TrameTrace+LgtTrameTrace)) && (TimeSampleRecupBalayage>TimeLastSampleSaved) );
  153.    /* Correction du fait qu'on a le dernier échantillon de pointé trop loin */
  154.    if (NbrSamplesBalayage>1)
  155.    {
  156.     NbrSamplesBalayage--;
  157.     /* Recherche du champ précédent */
  158.     PtrTrame--;
  159.     do
  160.     {
  161.      PtrTrame--;
  162.     }while(*PtrTrame!='\t');
  163.    }
  164.    /* Sauvegarde des nouveaux échantillons */
  165.    FTrace=fopen(Fichier,"ab");
  166.    if (FTrace)
  167.    {
  168.     for (i=1;i<=NbrSamplesBalayage;i++)
  169.     {
  170.      double ValSample;
  171.      /* On revient sur le champ précédent */
  172.      do
  173.      {
  174.       PtrTrame--;
  175.      }while(*PtrTrame!='\t');
  176.      /* Sauvegarde de l'horodate de l'échantillon */
  177.      TimeSampleRecupBalayage=TimeSampleRecupBalayage+PeriodSample;
  178.      fwrite(&TimeSampleRecupBalayage,sizeof(time_t),1,FTrace);
  179.      /* Sauvegarde de la valeur de l'échantillon */
  180.      ValSample=atof(PtrTrame+1);
  181.      fwrite(&ValSample,sizeof(double),1,FTrace);
  182.     }
  183.     fclose(FTrace);
  184.    }
  185.   }
  186.  }
  187. }
  188.  
  189.  
  190.  
  191. /* ######################################## */
  192. /* # Calculating the checksum of a string # */
  193. /* # with the protocol TRSII              # */
  194. /* ######################################## */
  195. unsigned int calcul_checksum_trsii(char * string,int Lgt)
  196. {
  197.  unsigned int chk=0;
  198.  int i;
  199.  for(i=0;i<Lgt;i++)
  200.  {
  201.   chk=chk+string[i];
  202.  }
  203.  chk=chk&63;
  204.  if (chk==0)
  205.  {
  206.   chk=64;
  207.  }
  208.  chk=64-chk;
  209.  chk=chk+64;
  210.  return chk;
  211. }
  212.  
  213. /* ########################################## */
  214. /* # Creating a TRSII request to send       # */
  215. /* # and saving which request was requested # */
  216. /* ########################################## */
  217. int send_request_trsii(char * CurRequestStr,int * CurRequestLgt,char * QuestStr,char * Param1Str,char * Param2Str,unsigned long * MemoTimeLaunchReq, int * TimeOutMaxi)
  218. {
  219.  int RequeteOk=FALSE;
  220.  char TrameEnvoi[64];
  221.  int LgtParam1;
  222.  int LgtParam2;
  223.  
  224.  LgtParam1=strlen(Param1Str);
  225.  LgtParam2=strlen(Param2Str);
  226.  
  227.  /* REQUEST 'ACCES' 'Password' */
  228.  /*----------------------------*/
  229.  if (strcmp(QuestStr,"ACCES")==0)
  230.  {
  231.  
  232. /* !!!!!!!!!!!!!!!!!!!!!! METTRE LA TRAME COMPLETE DANS CurRequestStr... (pour ETAT servira à
  233.    !!!!!!!!!!!!!!!!!!!!!! savoir si 1 ou 2 params demandés !!!!!!!!!!!!
  234.                           + réenvoi trame sur time-out!!!!
  235. */
  236.  
  237.  
  238.   strcpy(TrameEnvoi,"ACCES\t");
  239.   strcpy(TrameEnvoi+6,Param1Str);
  240.   TrameEnvoi[6+LgtParam1]='\t';
  241.   TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
  242.   strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
  243.   *TimeOutMaxi=3;
  244.   RequeteOk=TRUE;
  245.  }
  246.  
  247.  /* REQUETE 'IDENT?' */
  248.  /*------------------*/
  249.  if (strcmp(QuestStr,"IDENT?")==0)
  250.  {
  251.   strcpy(TrameEnvoi,"IDENT?\t");
  252.   TrameEnvoi[7]=calcul_checksum_trsii(TrameEnvoi,7);
  253.   strcpy(TrameEnvoi+8,"\n\0");
  254.   *TimeOutMaxi=3;
  255.   RequeteOk=TRUE;  
  256.  }
  257.  
  258.  /* REQUETE 'ETAT?' '1ère ressource' ['nbr de ressources'] */
  259.  /*---------------------------------------------------------*/
  260.  if (strcmp(QuestStr,"ETAT?")==0)
  261.  {
  262.   strcpy(TrameEnvoi,"ETAT?\t");
  263.   strcpy(TrameEnvoi+6,Param1Str);
  264.   TrameEnvoi[6+LgtParam1]='\t';
  265.   TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
  266.   strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
  267.   *TimeOutMaxi=3;
  268.   RequeteOk=TRUE;
  269.  }
  270.  
  271.  /* REQUETE 'RESS?' '1ère ressource' ['nbr de ressources'] */
  272.  /*---------------------------------------------------------*/
  273.  if (strcmp(QuestStr,"RESS?")==0)
  274.  {
  275.   strcpy(TrameEnvoi,"RESS?\t");
  276.   strcpy(TrameEnvoi+6,Param1Str);
  277.   TrameEnvoi[6+LgtParam1]='\t';
  278.   TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
  279.   strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
  280.   *TimeOutMaxi=4;
  281.   RequeteOk=TRUE;
  282.  }
  283.  
  284.  /* REQUETE 'TP?' '1ère trace' ['nbr de traces'] */
  285.  /*----------------------------------------------*/
  286.  if (strcmp(QuestStr,"TP?")==0)
  287.  {
  288.   strcpy(TrameEnvoi,"TP?\t");
  289.   strcpy(TrameEnvoi+4,Param1Str);
  290.   TrameEnvoi[4+LgtParam1]='\t';
  291.   TrameEnvoi[4+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,4+LgtParam1+1);
  292.   strcpy(TrameEnvoi+4+LgtParam1+2,"\n\0");
  293.   *TimeOutMaxi=4;
  294.   RequeteOk=TRUE;
  295.  }
  296.  
  297.  /* REQUETE 'T?' 'n° de la trace' ['nbr d'échantillons à récupérer']*/
  298.  /*-----------------------------------------------------------------*/
  299.  if (strcmp(QuestStr,"T?")==0)
  300.  {
  301.   strcpy(TrameEnvoi,"T?\t");
  302.   strcpy(TrameEnvoi+3,Param1Str);
  303.   TrameEnvoi[3+LgtParam1]='\t';
  304.   TrameEnvoi[3+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,3+LgtParam1+1);
  305.   strcpy(TrameEnvoi+3+LgtParam1+2,"\n\0");
  306.   *TimeOutMaxi=30;
  307.   RequeteOk=TRUE;
  308.  }
  309.  
  310.  /* REQUETE 'MESS?' 'n° de la boite aux lettres' */
  311.  /*-----------------------------------*/
  312.  if (strcmp(QuestStr,"MESS?")==0)
  313.  {
  314.   strcpy(TrameEnvoi,"MESS?\t");
  315.   strcpy(TrameEnvoi+6,Param1Str);
  316.   TrameEnvoi[6+LgtParam1]='\t';
  317.   TrameEnvoi[6+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,6+LgtParam1+1);
  318.   strcpy(TrameEnvoi+6+LgtParam1+2,"\n\0");
  319.   *TimeOutMaxi=20;
  320.   RequeteOk=TRUE;
  321.  }
  322.  
  323.  /* REQUETE 'DATE?' */
  324.  /*-----------------*/
  325.  if (strcmp(QuestStr,"DATE?")==0)
  326.  {
  327.   strcpy(TrameEnvoi,"DATE?\t");
  328.   TrameEnvoi[6]=calcul_checksum_trsii(TrameEnvoi,6);  
  329.   strcpy(TrameEnvoi+7,"\n\0");
  330.   *TimeOutMaxi=3;
  331.   RequeteOk=TRUE;  
  332.  }
  333.  
  334.  /* REQUETE 'TIME?' */
  335.  /*-----------------*/
  336.  if (strcmp(QuestStr,"TIME?")==0)
  337.  {
  338.   strcpy(TrameEnvoi,"TIME?\t");
  339.   TrameEnvoi[6]=calcul_checksum_trsii(TrameEnvoi,6);  
  340.   strcpy(TrameEnvoi+7,"\n\0");
  341.   *TimeOutMaxi=3;
  342.   RequeteOk=TRUE;
  343.  }
  344.  
  345.  /* REQUETE 'J?' ['#xxxxxx:N°Evenement'] ou [AAAAMMJJHHMMSS:DateHeure]   
  346.     /!\  CLIP uniquement : lecture du journal */
  347.  /*-------------------------------------------*/
  348.  if (strcmp(QuestStr,"J?")==0)
  349.  {
  350.   strcpy(TrameEnvoi,"J?\t");
  351.   if(LgtParam1>0)
  352.   {
  353.    strcpy(TrameEnvoi+3,Param1Str);
  354.    TrameEnvoi[3+LgtParam1]='\t';
  355.    TrameEnvoi[3+LgtParam1+1]=calcul_checksum_trsii(TrameEnvoi,3+LgtParam1+1);
  356.    strcpy(TrameEnvoi+3+LgtParam1+2,"\n\0");
  357.   }
  358.   else
  359.   {
  360.    TrameEnvoi[3]=calcul_checksum_trsii(TrameEnvoi,3);
  361.    strcpy(TrameEnvoi+4,"\n\0");
  362.   }
  363.   *TimeOutMaxi=5;
  364.   RequeteOk=TRUE;
  365.  }
  366.  
  367.  /* AUTRE... (Par-exemple Forçage mode TRSII 'ESC'W06) /!\ Pas-de réponse attendue */
  368.  if (strcmp(QuestStr,"OTHER")==0)
  369.  {
  370.   strcpy_limited(TrameEnvoi,Param1Str,LgtParam1);
  371.   RequeteOk=TRUE;
  372.  }
  373.   
  374.  
  375.  
  376.  if (RequeteOk==TRUE)
  377.  {
  378.   /* On mémorise la requête fraichement crée + sa longueur */
  379.   /* En cas d'erreur de Checksum/TimeOut, on la renverra... */
  380.   strcpy_limited(CurRequestStr,TrameEnvoi,strlen(TrameEnvoi)+1);
  381.   *CurRequestLgt=strlen(TrameEnvoi)+1;
  382.   /* Mémorisation de l'heure à laquelle on va lancer la requête pour le 'time-out' */
  383.   *MemoTimeLaunchReq=get_timer_secs();
  384.   /* Envoie la requête au port série */
  385.   Serial_Write(SerialIO,TrameEnvoi,strlen(TrameEnvoi));
  386.  }
  387.  else
  388.  {
  389. if(MoniteurActif)
  390. printf("Unknown request in TRSII send\n");
  391.    hangup_modem();
  392.    TeletransOnLine=FALSE;
  393.  }  
  394. }
  395.  
  396.  
  397. /* ############################# */
  398. /* # Receiving a TRSII request # */
  399. /* ############################# */
  400. int receive_request_trsii(char * CurRequestStr,int CurRequestLgt,unsigned long *MemoLaunchTime,int * Attemps,char * Trame,int * LgtTrame,int TimeOutToLook)
  401. {
  402.  int ReponseOk=FALSE;
  403.  int TraitementReponseExistant=FALSE;
  404.  int DemandeReenvoi=FALSE;
  405.  int TrameComplete;
  406.  char *ExtracChamp;
  407.  char NbrEnChaine[16];
  408.  int StatutRecu;
  409.  int StatutNotError;
  410.  int NumRess;
  411.  char LibelleRessource[LGT_LIBELLE_RESS];
  412.  char EtatRessource[LGT_ETAT_RESS];
  413.  char carac;
  414.  int i;
  415.  
  416.  TrameComplete=Serial_StringCompose(10,Trame,LgtTrame,MemoLaunchTime,TimeOutToLook);
  417.  
  418.  /* Trame complète reçue */
  419.  if (TrameComplete==TRUE)
  420.  {
  421.  
  422.   StatutRecu=0;
  423.   StatutNotError=TRUE;
  424.  
  425.   /* MESSAGE RECU 'STATUT' */
  426.   if (strcmp_limited(Trame,"STATUT",6)==0)
  427.   {
  428.    TraitementReponseExistant=TRUE;
  429.    ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  430.    strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  431.    StatutRecu=atoi(NbrEnChaine);
  432.    StatutNotError=FALSE;
  433.    switch(StatutRecu)
  434.    {
  435.      /* Erreur de checksum */
  436.      case 130:  DemandeReenvoi=TRUE;
  437. if (MoniteurActif)
  438. printf("Erreur checksum envoyé par la télétrans\n");
  439.                 break;
  440.      /* Accès interdit */
  441.      case 132:  hangup_modem();
  442.                 ErrorMessageRequest("ACCES INTERDIT!!!");
  443.                 TeletransOnLine=FALSE;
  444.                 break;
  445.      /* Err.Parametre */
  446.      case 133:
  447.                 if (strcmp_termnotnull(CurRequestStr,"TP?",13,9)==0)
  448.                 {
  449.                  StatutNotError=TRUE;
  450.                 }
  451.                 break;
  452.      /* OK */
  453.      case 0:    StatutNotError=TRUE;
  454.                 break;
  455.      /* FIN */
  456.      case 1:    StatutNotError=TRUE;
  457.                 break;
  458.      /* AUTRE... */   
  459.      default:
  460. if (MoniteurActif)
  461. printf("Erreur n°%d renvoyée par la télétrans\n",StatutRecu);
  462.        
  463.    }
  464.   }
  465.  
  466.   /* Pas reçu de statut d'erreur ? */
  467.   if (StatutNotError)
  468.   {
  469.  
  470.    /* VERIFICATION DU CHECKSUM POUR LA TRAME RECUE */
  471.    if (calcul_checksum_trsii(Trame,*LgtTrame-3)!=Trame[*LgtTrame-3])
  472.    {
  473. if (MoniteurActif)
  474. {
  475. printf("Détection erreur de checksum\n");
  476. printf("Checksum attendu:%d\n",calcul_checksum_trsii(Trame,*LgtTrame-3));
  477. }
  478.     DemandeReenvoi=TRUE;
  479.    }    
  480.    else
  481.    {
  482.     /* REQUEST 'ACCES' 'Password' */
  483.     /*----------------------------*/
  484.     if (strcmp_termnotnull(CurRequestStr,"ACCES",13,9)==0)
  485.     {
  486.      TraitementReponseExistant=TRUE;
  487.      if (str_pos(Trame,*LgtTrame,"OK",2)!=NULL)
  488.      {
  489.       ReponseOk=TRUE;
  490.      }
  491.     }
  492.  
  493.     /* REQUEST 'IDENT?' */
  494.     /*------------------*/
  495.     if (strcmp_termnotnull(CurRequestStr,"IDENT?",13,9)==0)
  496.     {
  497.      TraitementReponseExistant=TRUE;
  498.      if (strcmp_limited(Trame,"IDENT=",6)!=0)
  499.      {
  500.       DemandeReenvoi=TRUE;
  501.      }
  502.      else
  503.      {
  504.       ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  505.       if (ExtracChamp!=NULL)
  506.       {
  507.        strcpy_termnotnull(Teletrans.SiteName,ExtracChamp,13,9);
  508.       }
  509.       ExtracChamp=str_field(Trame,*LgtTrame,4,'\t');
  510.       if (ExtracChamp!=NULL)
  511.       {
  512.        strcpy(Teletrans.Type,"INCONNU");
  513.        Teletrans.TRSII_Extended_Clip=FALSE;
  514.        Teletrans.NumRessourcesMax=100;
  515.        Teletrans.NumTracesMax=0;
  516.        if (strcmp_termnotnull(ExtracChamp,"2A",13,9)==0)
  517.        {
  518.         strcpy(Teletrans.Type,"CLIP");
  519.         Teletrans.TRSII_Extended_Clip=TRUE;
  520.         Teletrans.NumRessourcesMax=255;
  521.         Teletrans.NumTracesMax=72;
  522.        }
  523.        if (strcmp_termnotnull(ExtracChamp,"29",13,9)==0)
  524.        {
  525.         strcpy(Teletrans.Type,"CLIP NANO");
  526.         Teletrans.TRSII_Extended_Clip=TRUE;
  527.         Teletrans.NumRessourcesMax=40;
  528.         Teletrans.NumTracesMax=12;
  529.        }
  530.        if (strcmp_termnotnull(ExtracChamp,"24",13,9)==0)
  531.        {
  532.         strcpy(Teletrans.Type,"FORCE X");
  533.        }
  534.        if (strcmp_termnotnull(ExtracChamp,"27",13,9)==0)
  535.        {
  536.         strcpy(Teletrans.Type,"FORCE PLUS");
  537.         Teletrans.NumRessourcesMax=128;
  538.        }
  539.        if (strcmp_termnotnull(ExtracChamp,"26",13,9)==0)
  540.        {
  541.         strcpy(Teletrans.Type,"FORCE MINI");
  542.         Teletrans.NumRessourcesMax=36;
  543.        }
  544.       }
  545.       ExtracChamp=str_field(Trame,*LgtTrame,3,'\t');
  546.       if (ExtracChamp!=NULL)
  547.       {
  548.        strcpy_termnotnull(Teletrans.Version,ExtracChamp,13,9);
  549.       }
  550.       ReponseOk=TRUE;
  551.       RefreshType=RFH_IDENTITE;
  552.      }
  553.     }
  554.  
  555.     /* REQUETE 'ETAT?' '1ère ressources' ['nbr de ressources'] */
  556.     /*---------------------------------------------------------*/
  557.     if (strcmp_termnotnull(CurRequestStr,"ETAT?",13,9)==0)
  558.     {
  559.      TraitementReponseExistant=TRUE;
  560.      if (strcmp_limited(Trame,"ETAT=",5)!=0)
  561.      {
  562.       DemandeReenvoi=TRUE;
  563.      }
  564.      else
  565.      {
  566.       ExtracChamp=str_field(Trame,*LgtTrame,4,'\t');
  567.       if (ExtracChamp!=NULL)
  568.       {
  569.        strcpy_termnotnull(EtatRessource,ExtracChamp,13,9);
  570.        ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  571.        if (ExtracChamp!=NULL)
  572.        {
  573.         strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  574.         NumRess=atoi(NbrEnChaine);
  575.         strcpy(Ress[NumRess].Etat,EtatRessource);
  576.         ReponseOk=TRUE;
  577.         RefreshType=RFH_ETAT_RESS;
  578.         RefreshParam=NumRess;
  579.        }
  580.       }
  581.      }
  582.     }
  583.  
  584.     /* REQUETE 'RESS?' '1ère ressources' ['nbr de ressources'] */
  585.     /*---------------------------------------------------------*/
  586.     if (strcmp_termnotnull(CurRequestStr,"RESS?",13,9)==0)
  587.     {
  588.      TraitementReponseExistant=TRUE;
  589.      if (strcmp_limited(Trame,"RESS=",5)!=0)
  590.      {
  591.       DemandeReenvoi=TRUE;
  592.      }
  593.      else
  594.      {
  595.       ExtracChamp=str_field(Trame,*LgtTrame,6,'\t');
  596.       if (ExtracChamp!=NULL)
  597.       {
  598.        strcpy_termnotnull(LibelleRessource,ExtracChamp,13,9);
  599.        /* Suppression des espaces en fin de chaine */
  600.        i=strlen(LibelleRessource);
  601.        if (i>0)
  602.        {
  603.         i--;
  604.         do
  605.         {
  606.          carac=LibelleRessource[i];
  607.          if (carac==32)
  608.          {
  609.           LibelleRessource[i]=0;
  610.          }
  611.          i--;
  612.         }
  613.         while((carac==32)&&(i>0));
  614.        }
  615.        ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  616.        if (ExtracChamp!=NULL)
  617.        {
  618.         strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  619.         NumRess=atoi(NbrEnChaine);
  620.         strcpy(Ress[NumRess].Libelle,LibelleRessource);
  621.         ReponseOk=TRUE;
  622.         RefreshType=RFH_LIBELLE_RESS;
  623.         RefreshParam=NumRess;
  624.        }
  625.       }
  626.      }
  627.     }
  628.  
  629.     /* REQUETE 'TP?' 'Numéro de la trace' */
  630.     /*------------------------------------*/
  631.     if (strcmp_termnotnull(CurRequestStr,"TP?",13,9)==0)
  632.     {
  633.      TraitementReponseExistant=TRUE;
  634.      /* Plus de trace ? : STATUS 133 Err.Parametre */
  635.      if (StatutRecu==133)
  636.      {
  637.       ReponseOk=TRUE;
  638.       RefreshType=RFH_PARAM_TRACE;
  639.       RefreshParam=0;     // indique qu'il ne faut plus lire les traces suivantes
  640.      }
  641.      else
  642.      {
  643.       if (strcmp_limited(Trame,"TP=",3)!=0)
  644.       {
  645.        DemandeReenvoi=TRUE;
  646.       }
  647.       else
  648.       {
  649.        /* Récupération du n° de trace depuis trame envoyée */
  650.        /* => si trace non paramétrée, trame réponse vide... */
  651.        ExtracChamp=str_field(CurRequestStr,CurRequestLgt,2,'\t');
  652.        if (ExtracChamp!=NULL)
  653.        {
  654.         strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  655.         NumRess=atoi(NbrEnChaine);
  656.        }
  657.        /* Trace non paramétrée ? */
  658.        if ( (Trame[5])== 13) // 'CR'
  659.        {
  660.         strcpy(Param_Trace,"");
  661.         Tra[NumRess].Used='A';
  662.        }
  663.        else
  664.        {
  665.         char *StrTraceOffset;
  666.         /* Servira à la sauvegarde sur disque */
  667.         strcpy_limited(Param_Trace,Trame+4,*LgtTrame-8);
  668.         Param_Trace[*LgtTrame-9]=0;
  669.         /* Ecriture dans la structure */
  670.         Tra[NumRess].Used='M';
  671.         strcpy_termnotnull(Tra[NumRess].NumMenu,Trame+4,9,0);
  672.         Tra[NumRess].NumMenu[3]=' ';
  673.         Tra[NumRess].NumMenu[4]='-';
  674.         Tra[NumRess].NumMenu[5]=' ';
  675.         StrTraceOffset=str_field(Trame+4,128,10,9);
  676.         if (StrTraceOffset)
  677.         {
  678.          strcpy_termnotnull(Tra[NumRess].Libelle,StrTraceOffset,9,0);
  679.         }
  680.        }
  681.        ReponseOk=TRUE;
  682.        RefreshType=RFH_PARAM_TRACE;
  683.        RefreshParam=NumRess;
  684.       }
  685.      }
  686.     }
  687.  
  688.     /* REQUETE 'T?' 'Numéro de la trace' */
  689.     /*-----------------------------------*/
  690.     if (strcmp_termnotnull(CurRequestStr,"T?",13,9)==0)
  691.     {
  692.      TraitementReponseExistant=TRUE;
  693.      /* Pas de trace paramétrée ? : STATUS 001 FIN */
  694.      if (StatutRecu==1)
  695.      {
  696.       ReponseOk=TRUE;
  697.      }
  698.      else
  699.      {
  700.       if (strcmp_limited(Trame,"T=",2)!=0)
  701.       {
  702.        DemandeReenvoi=TRUE;
  703.       }
  704.       else
  705.       {
  706.        ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  707.        if (ExtracChamp!=NULL)
  708.        {
  709.         char NomFichier[256];
  710.         strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  711.         NumRess=atoi(NbrEnChaine);
  712.         sprintf(NomFichier,"Sites/%s/Trace%03d",Teletrans.SiteName,NumRess);
  713.         save_trace_to_disk(NomFichier,Trame,*LgtTrame);
  714.         ReponseOk=TRUE;
  715.         RefreshType=RFH_TRACE;
  716.         RefreshParam=NumRess;
  717.        }
  718.       }
  719.      }
  720.     }
  721.  
  722.     /* REQUETE 'MESS?' 'Numéro de la boite aux lettres' */
  723.     /*--------------------------------------------------*/
  724.     if (strcmp_termnotnull(CurRequestStr,"MESS?",13,9)==0)
  725.     {
  726.      TraitementReponseExistant=TRUE;
  727.      if (strcmp_limited(Trame,"MESS=",5)!=0)
  728.      {
  729.       DemandeReenvoi=TRUE;
  730.      }
  731.      else
  732.      {
  733.       ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  734.       if (ExtracChamp!=NULL)
  735.       {
  736.        strcpy_termnotnull(NbrEnChaine,ExtracChamp,13,9);
  737.        NumRess=atoi(NbrEnChaine);
  738.        ExtracChamp=str_field(Trame,*LgtTrame,3,'\t');
  739.        if (ExtracChamp!=NULL)
  740.        {
  741.         strcpy_termnotnull(MessagesBox[NumRess],ExtracChamp,13,9);
  742.         ReponseOk=TRUE;
  743.         RefreshType=RFH_MESSAGEBOX;
  744.         RefreshParam=NumRess;
  745.        }
  746.       }
  747.      }
  748.     }
  749.  
  750.     /* REQUETE 'DATE?' */
  751.     /*-----------------*/
  752.     if (strcmp_termnotnull(CurRequestStr,"DATE?",13,9)==0)
  753.     {
  754.      TraitementReponseExistant=TRUE;
  755.      if (strcmp_limited(Trame,"DATE=",5)!=0)
  756.      {
  757.       DemandeReenvoi=TRUE;
  758.      }
  759.      else
  760.      {
  761.       ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  762.       if (ExtracChamp!=NULL)
  763.       {
  764.        strcpy_termnotnull(Teletrans.LocalDate,ExtracChamp,13,9);
  765.        ReponseOk=TRUE;
  766.        RefreshType=RFH_DATE;
  767.       }
  768.      }
  769.     }
  770.  
  771.     /* REQUETE 'TIME?' */
  772.     /*-----------------*/
  773.     if (strcmp_termnotnull(CurRequestStr,"TIME?",13,9)==0)
  774.     {
  775.      TraitementReponseExistant=TRUE;
  776.      if (strcmp_limited(Trame,"TIME=",5)!=0)
  777.      {
  778.       DemandeReenvoi=TRUE;
  779.      }
  780.      else
  781.      {
  782.       ExtracChamp=str_field(Trame,*LgtTrame,2,'\t');
  783.       if (ExtracChamp!=NULL)
  784.       {
  785.        strcpy_termnotnull(Teletrans.LocalTime,ExtracChamp,13,9);
  786.        ReponseOk=TRUE;
  787.        RefreshType=RFH_TIME;
  788.       }
  789.      }
  790.     }
  791.  
  792.     /* REQUETE 'J?' */
  793.     /*--------------*/
  794.     if (strcmp_termnotnull(CurRequestStr,"J?",13,9)==0)
  795.     {
  796.      TraitementReponseExistant=TRUE;
  797.      /* Fin du journal ? : Statut 001 FIN */
  798.      if (StatutRecu==1)
  799.      {
  800.       strcpy(Even_Journal,"FIN");
  801.       ReponseOk=TRUE;
  802.       RefreshType=RFH_JOURNAL;
  803.      }
  804.      else
  805.      {
  806.       if (strcmp_limited(Trame,"J=",2)!=0)
  807.       {
  808.        DemandeReenvoi=TRUE;
  809.       }
  810.       else
  811.       {
  812.        strcpy_limited(Even_Journal,Trame+4,*LgtTrame-4);
  813.        Even_Journal[*LgtTrame-8]=0;
  814.        ReponseOk=TRUE;
  815.        RefreshType=RFH_JOURNAL;
  816.       }
  817.      }
  818.     }
  819.  
  820.  
  821.     if (!(TraitementReponseExistant))
  822.     {
  823.      ErrorMessageRequest("Pas de traitement implémenté pour la demande envoyée...");
  824.      ErrorMessageRequest("Ce programme a planté...bouhhhh...");
  825.      exit(30);
  826.     }
  827.     if (!(ReponseOk))
  828.     {
  829.      DemandeReenvoi=TRUE;
  830.     }
  831.  
  832.    } 
  833.   }
  834.  }
  835.  if (ReponseOk==TRUE)
  836.  {
  837.   strcpy(CurRequestStr,"");
  838.  }
  839.  /* Time Out */
  840.  if (*MemoLaunchTime==NULL)
  841.  {
  842.   DemandeReenvoi=TRUE;
  843.  }
  844.  /* Réenvoyer la trame requête car problème dans la réponse ou TimeOut*/
  845.  if (DemandeReenvoi==TRUE)
  846.  {
  847.   *Attemps=*Attemps-1;
  848.   /* Il reste des essais ? */
  849.   if (*Attemps>0)
  850.   {
  851.    *MemoLaunchTime=get_timer_secs();
  852.    *LgtTrame=0;
  853.    if (MoniteurActif)
  854.     Print_Monitor("¤",1,0,0);
  855.    Serial_Write(SerialIO,CurRequestStr,CurRequestLgt);
  856.   }
  857.   else
  858.   {
  859.    /* Trop de merdes, on raccroche */
  860.    hangup_modem();
  861.    TeletransOnLine=FALSE;
  862.   }
  863.  }
  864.  return ReponseOk;
  865. }
  866.  
  867.